CREATE EXTENSION test_predtest;
\pset expanded oncreate table booleans asselect  case i%3 when 0 then true when 1 then false else null end as x,  case (i/3)%3 when 0 then true when 1 then false else null end as y,  case (i/9)%3 when 0 then true when 1 then false else null end as z,  case (i/27)%3 when 0 then true when 1 then false else null end as wfrom generate_series(0, 3*3*3*3-1) i;
create table integers asselect  case i%11 when 10 then null else i%11 end as x,  case (i/11)%11 when 10 then null else (i/11)%11 end as yfrom generate_series(0, 11*11-1) i;
create function strictf(bool, bool) returns boollanguage plpgsql as begin return  1 and not  2;
 end strict;
 end strict;
create function opaque_array(int[]) returns int[]language plpgsql as begin return  1;
 end strict;
 end strict;
select * from test_predtest(select x, xfrom booleans);
select * from test_predtest(select x, not xfrom booleans);
select * from test_predtest(select not x, xfrom booleans);
select * from test_predtest(select not x, not xfrom booleans);
select * from test_predtest(select x is not null, xfrom booleans);
select * from test_predtest(select x is not null, x is nullfrom integers);
select * from test_predtest(select x is null, x is not nullfrom integers);
select * from test_predtest(select x is not true, xfrom booleans);
select * from test_predtest(select x, x is not truefrom booleans);
select * from test_predtest(select x is false, xfrom booleans);
select * from test_predtest(select x, x is falsefrom booleans);
select * from test_predtest(select x is unknown, xfrom booleans);
select * from test_predtest(select x, x is unknownfrom booleans);
select * from test_predtest(select x is null, xfrom booleans);
select * from test_predtest(select x, x is nullfrom booleans);
select * from test_predtest(select strictf(x,y), x is nullfrom booleans);
select * from test_predtest(select (x is not null) is not true, xfrom booleans);
select * from test_predtest(select strictf(x,y), (x is not null) is falsefrom booleans);
select * from test_predtest(select x > y, (y < x) is falsefrom integers);
select * from test_predtest(select x, x and yfrom booleans);
select * from test_predtest(select not x, x and yfrom booleans);
select * from test_predtest(select x, not x and yfrom booleans);
select * from test_predtest(select x or y, xfrom booleans);
select * from test_predtest(select x and y, xfrom booleans);
select * from test_predtest(select x and y, not xfrom booleans);
select * from test_predtest(select x and y, y and xfrom booleans);
select * from test_predtest(select not y, y and xfrom booleans);
select * from test_predtest(select x or y, y or xfrom booleans);
select * from test_predtest(select x or y or z, x or zfrom booleans);
select * from test_predtest(select x and z, x and y and zfrom booleans);
select * from test_predtest(select z or w, x or yfrom booleans);
select * from test_predtest(select z and w, x or yfrom booleans);
select * from test_predtest(select x, (x and y) or (x and z)from booleans);
select * from test_predtest(select (x and y) or z, y and xfrom booleans);
select * from test_predtest(select (not x or not y) and z, y and xfrom booleans);
select * from test_predtest(select y or x, (x or y) and zfrom booleans);
select * from test_predtest(select not x and not y, (x or y) and zfrom booleans);
select * from test_predtest(select x <= y, x < yfrom integers);
select * from test_predtest(select x <= y, x > yfrom integers);
select * from test_predtest(select x <= y, y >= xfrom integers);
select * from test_predtest(select x <= y, y > x and y < x+2from integers);
select * from test_predtest(select x <= 5, x <= 7from integers);
select * from test_predtest(select x <= 5, x > 7from integers);
select * from test_predtest(select x <= 5, 7 > xfrom integers);
select * from test_predtest(select 5 >= x, 7 > xfrom integers);
select * from test_predtest(select 5 >= x, x > 7from integers);
select * from test_predtest(select 5 = x, x = 7from integers);
select * from test_predtest(select x is not null, x > 7from integers);
select * from test_predtest(select x is not null, int4lt(x,8)from integers);
select * from test_predtest(select x is null, x > 7from integers);
select * from test_predtest(select x is null, int4lt(x,8)from integers);
select * from test_predtest(select x is not null, x < 'foo'from (values  ('aaa'::varchar), ('zzz'::varchar), (null)) as v(x));
select * from test_predtest(select x <= 5, x in (1,3,5)from integers);
select * from test_predtest(select x <= 5, x in (1,3,5,7)from integers);
select * from test_predtest(select x <= 5, x in (1,3,5,null)from integers);
select * from test_predtest(select x in (null,1,3,5,7), x in (1,3,5)from integers);
select * from test_predtest(select x <= 5, x < all(array[1,3,5])from integers);
select * from test_predtest(select x <= y, x = any(array[1,3,y])from integers);
select * from test_predtest(select x is not null, x = any(opaque_array(array[1]))from integers);
select * from test_predtest(select x is not null, x <> all(opaque_array(array[1]))from integers);
select * from test_predtest(select x is not null, x <> all(array[  1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,  29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,  54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,  79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101])from integers);
select * from test_predtest(select x is not null, x <> all(array[  1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,  29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,  54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,  79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,y])from integers);
select * from test_predtest(select x is not null, x = any(opaque_array(array[]::int[]))from integers);
select * from test_predtest(select x is not null, x <> all(opaque_array(array[]::int[]))from integers);
select * from test_predtest(select x is not null, strictf(true, x = any(opaque_array(array[]::int[])))from integers);
select * from test_predtest(select x is null, x = any(opaque_array(array[1]))from integers);
select * from test_predtest(select x is null, x <> all(opaque_array(array[1]))from integers);
select * from test_predtest(select x is null, x <> all(array[  1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,  29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,  54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,  79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101])from integers);
select * from test_predtest(select x is null, x = any(opaque_array(array[]::int[]))from integers);
select * from test_predtest(select x is null, x <> all(opaque_array(array[]::int[]))from integers);
select * from test_predtest(select x is null, strictf(true, x = any(opaque_array(array[]::int[])))from integers);
select * from test_predtest(select x = any(opaque_array(array[1])), x is nullfrom integers);
select * from test_predtest(select x = any(opaque_array(array[y])), array[y] is nullfrom integers);
select * from test_predtest(select x = all(opaque_array(array[1])), x is nullfrom integers);
